package com.lgc.javathread.signalTest.countDownLatchTest;

import java.util.concurrent.CountDownLatch;

/**
 * CountDownLatch是一个异步辅助类，它能让一个和多个线程处于等待状态，直到其他线程完成了一些列操作。
 * 比如某个线程需要其他线程执行完毕才能执行其他的
 * public void await() throws InterruptedException { };   //调用await()方法的线程会被挂起，它会等待直到count值为0才继续执行
 * public boolean await(long timeout, TimeUnit unit) throws InterruptedException { };  //和await()类似，只不过等待一定的时间后count值还没变为0的话就会继续执行
 * public void countDown() { };  //将count值减1
 */
public class CountDownLatchTest {
    public static void main(String[] args) {
        final CountDownLatch latch = new CountDownLatch(3);

        new Thread(()->{
            System.out.println("子线程1执行开始");
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("子线程1执行结束");

            latch.countDown();
        }).start();

        new Thread(){
            @Override
            public void run(){
                System.out.println("子线程2执行开始");
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("子线程2执行结束");

                latch.countDown();
            }
        }.start();

        new Thread(()->{
            System.out.println("子线程3执行开始");
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("子线程3执行结束");

            latch.countDown();
        }).start();

        try {
            //调用await()方法的线程会被挂起，它会等待直到count值为0才继续执行
            latch.await();

            //等待一定的时间后count值还没变为0的话就会继续执行
//            latch.await(5,TimeUnit.SECONDS);
            System.out.println("所有子线程执行完毕了。。。");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
